package com.itheima.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itheima.constant.MessageConstant;
import com.itheima.constant.RedisMessageConstant;
import com.itheima.entity.Result;
import com.itheima.pojo.Member;
import com.itheima.service.MemberService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisPool;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Map;

/**
 * @desc 处理会员相关操作
 * @Date 2020/10/19 14:38
 */
@RestController
@RequestMapping("/member")
public class MemberController {

    //注入redis连接池
    @Autowired
    private JedisPool jedisPool;

    @Reference
    private MemberService memberService;


    /**
     * 会员登录
     *
     * @param map 提交的电话号码和验证码封装到map里面
     * @return
     */
    @RequestMapping("/login")
    public Result login(@RequestBody Map map, HttpServletResponse response) {

        //1、校验用户输入的短信验证码是否正确，如果验证码错误则登录失败
        //取出用户的电话和验证码
        String telephone = (String) map.get("telephone");   //电话号码
        String validateCode = (String) map.get("validateCode"); //验证码

        //取出redis里面的验证码，进行比对
        String validateCodeInRedis = jedisPool.getResource().get(telephone + RedisMessageConstant.SENDTYPE_LOGIN);

        //比对
        if (validateCode != null && validateCodeInRedis != null && validateCode.equals(validateCodeInRedis)) {
            //比对成功表示验证码正确
            //2、如果验证码正确，则判断当前用户是否为会员，如果不是会员则自动完成会员注册
            //查询诗句库，查看用户是否为会员  （数据库有电话号码证明为注册过）
            Member member = memberService.findBytelephone(telephone);

            if (member == null) {
                //查出的数据为空，表示这个用户不是会员，自动添加为会员
                //设置一些会员的基本信息
                member.setRegTime(new Date());   //成为会员的事件，当天为准
                member.setPhoneNumber(telephone);  //会员的电话号码  这个是重点
                memberService.add(member);
            }

            // 3、向客户端写入Cookie，内容为用户手机号
            //如果是会员，就向用户的浏览器写入cookie
            Cookie cookie = new Cookie("login_member_telephone", telephone);  //值就是用户的电话号码
            cookie.setPath("/");   //路径为 /  本项目的共享路径
            cookie.setMaxAge(60 * 60 * 24 * 30);   //保存时间为30天
            //通过响应将cookie写进去
            response.addCookie(cookie);

            //4、将会员信息保存到Redis，使用手机号作为key，保存时长为30分钟
            //保存会员的所有的信息 redis不支持对象，将对象转成json

            ObjectMapper objectMapper = new ObjectMapper();

            try {
                String json = objectMapper.writeValueAsString(member);  //将对象转成json

                // FIXME: 2020/10/19  登录的有效期限  30* 60  30分钟
                jedisPool.getResource().setex(telephone, 999999999, json);   //将会员的信息保存到json里面，时间30分钟，30分钟后重新登录

            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return new Result(true, MessageConstant.LOGIN_SUCCESS);

        } else {
            //验证码错误，直接返回提示信息
            return new Result(false, MessageConstant.VALIDATECODE_ERROR);
        }
    }


}
